www.gusucode.com > som-bp混合神经网络的matlab程序源码 > matlab_emulator/HybridNet/复件 SOM_choose.m

    %%  som mapping and distinct the classs of significant and not
%------------------------  Mapping the positve training samples--------------------------------------
 function [pos_train_sample,pos_test_sample,neg_train_sample,neg_test_sample,net]  = SOM_choose(pos_sample,neg_sample,sizeout,SOM_epochs,net)
   P = [pos_sample, neg_sample];
   [feature_num sample_num] = size(P); 
   pos_num = size(pos_sample,2);
   neg_num = size(neg_sample,2);
   SOM_out_num = [sizeout  sizeout];                  % 输出节点数目   
   SOM_input_num = feature_num;           % 输入节点数目
   
    MinMaxValue = [zeros(feature_num ,1),ones(feature_num,1)]; 
%     net  = newsom( MinMaxValue,SOM_out_num);
%     net.trainParam.epochs = SOM_epochs;   
%     net.trainParam.show = 1000;
   
%     -------- som training 
    begin_time = clock;
%     [net,tr,Y,E,Pf,Af] = train(net,P);
    Y = sim(net,P);
    cost_time = etime(clock,begin_time)

    %  map distribution  
    [Maxvalue max_num] = max(Y);    
    distr = zeros(pos_num,2);
    for(i=1:sample_num)
        distr(i,1) = floor((max_num(i)-1)/sizeout)+1;
        distr(i,2) = max_num(i)-( distr(i,1) - 1 )*sizeout+1;
        distr(i,2) = rem(max_num(i)-1,sizeout)+1;
    end

    
    distr_pos = distr(1:pos_num,:);
    distr_neg = distr(pos_num+1:sample_num,:);
    % plot the distribution of the map result
    figure
    for(i=1:pos_num)
        hold on
        plot(distr_pos(i,1),distr_pos(i,2),'r*');
    end
    for(i=1:neg_num)
        hold on
        plot(distr_neg(i,1),distr_neg(i,2),'bsquare');
    end
    title('som result distribution ')
    
    % cal the center of the positive class
    center = floor(mean(distr_pos,1));
    plot(center(1),center(2),'rO','LineWidth',2,...
                'MarkerEdgeColor','k',...
                'MarkerFaceColor','g',...
                'MarkerSize',10);
    % cal the distance of the positive class, the mean distance, the max_num distance
    dislength = zeros(pos_num,1);
    dislength = dist(distr_pos,center');
    mean_dist = mean( dislength,1);
    max_dist = max( dislength);
    thresh_dist = floor((mean_dist+max_dist)/2);
    train_num = 0;
    test_num = 0;
    train_som = zeros(feature_num,pos_num);
    test_som = zeros(feature_num,pos_num);
    for(i=1:pos_num)
        if( dislength(i)<=thresh_dist)
            train_num = train_num + 1;
            train_som(:,train_num) = pos_sample(:,i);
            % choose the train sample
            hold on 
            plot(distr_pos(i,1),distr_pos(i,2),'c+');
        else
            test_num = test_num + 1;
            test_som(:,test_num) = pos_sample(:,i);
        end
    end
    pos_train_sample = train_som(:,1:train_num);
    pos_test_sample = test_som(:,1:test_num);
    

    
   % cal the center of the positive class
    center = floor(mean(distr_neg,1));
   hold on 
    plot(center(1),center(2),'rO','LineWidth',2,...
                'MarkerEdgeColor','k',...
                'MarkerFaceColor','g',...
                'MarkerSize',10);

    % cal the distance of the positive class, the mean distance, the max_num distance
    dislength = zeros(neg_num,1);
    dislength = dist(distr_neg,center');
    mean_dist = mean( dislength,1);
    max_dist = max( dislength);
    thresh_dist = floor((mean_dist+max_dist)/2);
    train_num = 0;
    test_num = 0;
    train_som = zeros(feature_num,neg_num);
    test_som = zeros(feature_num,neg_num);
    for(i=1:neg_num)
        if( dislength(i)<=thresh_dist)
            train_num = train_num + 1;
            train_som(:,train_num) = neg_sample(:,i);
            % choose the train sample
            hold on 
            plot(distr_neg(i,1),distr_neg(i,2),'Mx');
        else
            test_num = test_num + 1;
            test_som(:,test_num) = neg_sample(:,i);
        end
    end
    neg_train_sample = train_som(:,1:train_num);
    neg_test_sample = test_som(:,1:test_num);